package com.shujia.Day07;

import java.util.Objects;

public class Demo01Object {
    public static void main(String[] args) throws CloneNotSupportedException{

        /*
            TODO 方法：
                 clone() => 创建并返回此对象的副本
                 equals => 判断两个对象是否相等
                      equals 默认底层使用 == 对两个对象地址进行判断，如果地址相同，那么结果为true
                 hashCode() => 返回对象的Hash值，该函数是一个映射函数  传入一个值，肯定有一个唯一对应的随机的值
                 toString() => 用于将当前对象转换成一个字符串
                 getClass() =>
         */
        Object object = new Object();
        String objStr = object.toString();
        System.out.println(objStr); // java.lang.Object@4554617c
        System.out.println(object); // java.lang.Object@4554617c  println就是调用了 toString 方法

        String str = new String("这是一个字符串");
        System.out.println(str.toString());  // 子类可以重写toString 方法

        MyClass myClass1 = new MyClass("toString", "这是一个自定义类");
        MyClass myClass2 = new MyClass("toString", "这是一个自定义类");
        System.out.println(myClass1);
        System.out.println(myClass1.equals(myClass2)); // true

        // TODO 在Java中Class也是一个类 该类的对象表示 类对象
        Class aClass = myClass1.getClass();
        System.out.println(aClass.getName().toString()); // 获取当前对象的类路径







    }
}

/*
    对于一个自定义类，如果该类用于表述数据 那么其规范的写法：
        比如对于 Mysql中的emp表 每一行数据代表是一个员工类 员工的字段是类中的属性
 */
class MyClass{
    private String name;
    private String data;

    public MyClass(String name, String data) {
        this.name = name;
        this.data = data;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyClass myClass = (MyClass) o;
        return Objects.equals(name, myClass.name) && Objects.equals(data, myClass.data);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, data);
    }
    /*
       TODO  对于外部获取当前类对象的信息时，一般会调用toString方法
            对于继承的toString方法 不能获取其属性信息  所以需要对其进行重写
     */

    @Override
    public String toString() {
        return "MyClass{" +
                "name='" + name + '\'' +
                ", data='" + data + '\'' +
                '}';
    }
}